#include<iostream>
#include"Thread.hpp"
#include <vector>
// #include<pthread.h>
// #include<unistd.h>
// #include<vector>
using namespace yangbiao;
void print(const int &data){
    std::cout<<"你是煞笔吗"<<std::endl;
}
；
const int threadnum = 5;
int main()
{
    // 创建一批线程
    std::vector<Thread<int>> threads;
    for(int i = 0;i<threadnum;i++){
        std::string name = "thread -" + std::to_string(i+1);
        threads.emplace_back(print,10,name);
    }


    // 启动一批线程
    for(auto& thread:threads){
        thread.Start();
    }

      // 回收一批线程
    for(auto &thread:threads){
        thread.Join();
        std::cout<<"wait success"<<std::endl;
    }
   
    
    return 0;
}





























// #define threadnum 5
// class Task
// {
// public:
//     Task(int x,int y):_x(x),_y(y)
//     {}
//     int Execute()
//     {
//         return _x + _y;
//     }
// private:
//     int _x;
//     int _y;
// };
// class Result
// {
// public: 
//     Result(){}
//     ~Result(){}
//     void SetResult(int result,const std::string & threadname){
//         _result = result;
//         _threadname = threadname;
//     }
//     int GetResult(){
//         return _result;
//     }
//     const std::string GetThreadName(){
//         return _threadname;
//     }
//     void Print()
//     {
//         std::cout<< "threadName: "<<_threadname <<" Result: "<<_result<<std::endl;
//     }
// private:
//     int _result;
//     std::string _threadname;
// };
// class ThreadData
// {
// public:
//     ThreadData(int x,int y,std::string threadname): _t(x,y),_threadname(threadname)
//     {}
//     std::string threadname(){
//         return _threadname;
//     }
//     int run()
//     {
//         return _t.Execute();
//     }
// private:
//     std::string _threadname;
//     Task _t;
    
// };
// void* handlerTask(void* args)
// {
//     ThreadData* td = static_cast<ThreadData*>(args);
//     Result* res = new Result();
//     int result = td->run();
//     res->SetResult(result,td->threadname());
//     std::cout<< "i am "<<td->threadname() <<" And my result :" <<result <<std::endl;
//     delete td;
//     return res;
// }
// int main()
// {
//     std::vector<pthread_t> threads;
//     for(int i = 0;i<threadnum;i++){
//         char* threadname = new char[64];
//         snprintf(threadname,64,"Thread:%d",i+1);
//         ThreadData* threadData = new ThreadData(12,20,threadname);
//         pthread_t tid;
//         pthread_create(&tid,nullptr,handlerTask,threadData);
//         threads.push_back(tid);
//     }
//     std::vector<Result*> result_set;
//     void* ret = nullptr;
//     for(auto& tid:threads){
//         pthread_join(tid,&ret);
//         result_set.push_back((Result*)ret);
//     }
//     for(auto & res:result_set){
//         res->Print();
//     }

// }


























// void* threadrun(void* args)
// {
//     int cnt = 5;
//     std::string threadname = (char*)args;
//     while(cnt--)
//     {
//         std::cout<< "i am "<< threadname <<std::endl;
//         sleep(1);
//         // pthread_exit((void*)321); // 推荐退出线程的方式.
//         // int* pa = nullptr;
//         // *pa = 100; // 故意出现野指针错误
//     }
//     // exit(10); // 主动退出线程,使用exit表示进程全部退出,不推荐使用
    
//     return (void*)123;
// }
// int main()
// {
    
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadrun,(void*)"thread-111");
//     int cnt = 2;
//     while(cnt--)
//     {
//         std::cout<< "i am main thread" <<std::endl;
//         sleep(1);
//     }
    
//     pthread_cancel(tid); // 直接取消线程,退出码就是-1
//     void* ret = nullptr;
//     // 获取线程的返回值.这里不考虑失败的情况.因为一旦有一个线程出现了错误之后,整个进程就会直接退出
//     pthread_join(tid,&ret); 
//     std::cout<<(long long)ret<<std::endl;

// }
